package com.cskaoyan.javase.oop3.formal3;

/**
 * @description: 用抽象类和接口作为方法的参数
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 ***1.基本类型：**传递的是参数值，需要的是对应类型的基本类型变量值
 *      对于基本数据类型的方法传参，这里是存在类型提升的
 * **2.引用类型：**传递的是地址，所以需要的参数也是引用类型
 *      引用数据类型的方法传参，存在自动类型提升
 *  a.类：方法需要传入的是该类的对象或者该类的子类对象
 *  b.抽象类：需要创建的是该抽象类的子类对象传入
 *  c.接口：需要创建的是接口的子类对象
 *
 */
public class Demo {
    public static void main(String[] args) {
        test(1.0F);
        test(new Person());
        test(new Student()); //子类就是父类

        test(new Person2());//传入抽象类子类
        test(new IImpl());//传入接口的子类
    }

    public static void test(double a) {
    }

    public static void test(Person person) { //方法的重载
    }

    public static void test(AbstractPerson person) { //方法的重载
    }

    public static void test(I i) { //方法的重载
    }
}

class Person {
}

class Student extends Person {
}

abstract class AbstractPerson {
}

class Person2 extends AbstractPerson {
}

interface I {
}

class IImpl implements I {
}
